// 函数声明: 描述函数的形参类型和函数返回值的类型
// function fn(x: number, y: number): number {
//   return x + y
// }

// 函数表达式:
// 第7行代码,是在描述fn1变量未来要存储的函数是什么样子的
// let fn1: (x: number, y: number) => number
// // 第10行代码是给fn1变量赋值,值是一个函数
// fn1 = (x: number, y: number): number => {
//   return x + y
// }

// fn1 = (a, b) => {
//   return a + b
// }

// 可选参数: 形参后面加?就是可选参数
// 注意: 可选参数不能写在必填的参数前面
// function fn(x: number, y: number, z?: number): number {
//   return x + y
// }

// ts中严格要求形参的数量和数据类型
// fn(1, 2)

// 形参的默认值
// function fn(x: number = 1, y: number, z?: number): number {
//   return x + y
// }
// 函数,传递形参和实参,一定要按照顺序传递
// fn(undefined, 2, 3)

// 剩余参数:指如何描述一个剩余参数
// 剩余参数本质就是一个数组,所以用数组的方式描述即可
// function fn(x: number, y: number, ...args: any[]) {}

// fn(1, 2, 3, 4, 45, 5, 6, 7)
// fn(1, 2, 3, '1234', '234')

// 函数重载
// 利用函数重载,可以明确的告诉ts.如果调用reverse传入的是字符串,则返回值也一定是字符串,数字也是这样
// 函数重载的作用: 当形参或返回值是不确定的类型时,利用函数重载可以声明各种情况对应的形参和返回值
function reverse(x: string): string
function reverse(x: number): number
function reverse(x: number | string): number | string | void {
  if (typeof x === 'number') {
    return Number(x.toString().split('').reverse().join(''))
  } else if (typeof x === 'string') {
    return x.split('').reverse().join('')
  }
}
reverse('123').trim()
reverse(123).trim()
